﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 * 应用程序基类。
 * 
 * 最后修改：2011-10-28
 * ************************************************************/
namespace Mozlite.Common
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using Mozlite.Common.Configuration;

    /// <summary>
    /// 应用程序基类。
    /// </summary>
    public abstract class ApplicationBase : BaseObject
    {
        /// <summary>
        /// 初始化类<see cref="T:Mozlite.Common.ApplicationBase"/>。
        /// </summary>
        public ApplicationBase() { }

        /// <summary>
        /// 扩展保存列重写。
        /// </summary>
        protected override string ExtendFieldName
        {
            get
            {
                return "ApplicationData";
            }
        }

        /// <summary>
        /// 获取或设置应用程序GUID。
        /// </summary>
        public abstract string ApplicationID { get; }

        /// <summary>
        /// 获取或设置应用程序名称。
        /// </summary>
        public abstract string ApplicationName { get; }

        /// <summary>
        /// 获取或设置应用程序区域名称,需要唯一或者空。
        /// </summary>
        public abstract string AreaName { get; }

        /// <summary>
        /// 当前应用程序编译版本。
        /// </summary>
        public virtual int VersionBuild { get; set; }

        /// <summary>
        /// 版本字符串显示。
        /// </summary>
        public abstract string VersionString { get; }

        /// <summary>
        /// 安装当前程序时间。
        /// </summary>
        public DateTime CreateDate { get; set; }

        /// <summary>
        /// 上一次更新程序时间。
        /// </summary>
        public DateTime UpdateDate { get; set; }

        /// <summary>
        /// 更新地址。
        /// </summary>
        public abstract string UpgradeUrl { get; }

        /// <summary>
        /// 作者。
        /// </summary>
        public abstract string Author { get; }

        /// <summary>
        /// 是否支持模板。
        /// </summary>
        public virtual bool IsThemable { get { return false; } }

        /// <summary>
        /// 帮助文档URL。
        /// </summary>
        public virtual string SupportUrl { get { return null; } }

        /// <summary>
        /// 通过以数据库读取器为常数实例化类。
        /// </summary>
        /// <param name="reader">数据库读取器。</param>
        /// <returns>返回应用程序基类。</returns>
        public static ApplicationBase CreateInstance(IDataReader reader)
        {
            var type = Type.GetType(reader.GetString("type"));
            if (type == null)
                return null;
            var instance = Activator.CreateInstance(type) as ApplicationBase;
            if (instance != null)
                instance.LoadFromDataReader(reader);
            return instance;
        }

        /// <summary>
        /// 从数据库中加载数据。
        /// </summary>
        /// <param name="reader">数据库读取器。</param>
        protected override void Load(IDataReader reader)
        {
            this.VersionBuild = reader.GetInt32("VersionBuild");
            this.CreateDate = reader.GetDateTime("CreateDate");
            this.UpdateDate = reader.GetDateTime("UpdateDate");
        }

        /// <summary>
        /// 获取当前应用程序配置类。
        /// </summary>
        /// <returns>返回当前应用程序配置类。</returns>
        internal ConfigurationBase GetConfiguration() {
            var configuration = Applications.GetConfiguration(this.ApplicationID, SiteSettings.Current.SettingsID);
            if (configuration == null)
                configuration = new ConfigurationBase();
            return configuration;
        }

        /// <summary>
        /// 获取应用程序配置URL地址。
        /// </summary>
        /// <remarks>控制面板应用程序配置URL地址。</remarks>
        public abstract string ConfigurationUrl { get; }

        /// <summary>
        /// 保存当前应用程序实例。
        /// </summary>
        /// <returns>返回保存结果。</returns>
        public virtual bool Save() { return true; }
    }

    /// <summary>
    /// 应用程序基类。
    /// </summary>
    /// <typeparam name="TApplication">应用程序类。</typeparam>
    /// <typeparam name="TConfiguration">应用程序配置类。</typeparam>
    public abstract class ApplicationBase<TApplication, TConfiguration> : ApplicationBase
        where TApplication : ApplicationBase<TApplication, TConfiguration>, new()
        where TConfiguration : ConfigurationBase<TConfiguration>, new()
    {
        /// <summary>
        /// 初始化类<see cref="T:Mozlite.Common.ApplicationBase"/>。
        /// </summary>
        public ApplicationBase() { }

        /// <summary>
        /// 获取当前应用程序实例。
        /// </summary>
        public static TApplication Current
        {
            get
            {
                TApplication current = new TApplication();
                ApplicationBase application;
                if (Applications.LoadApplications().TryGetValue(current.ApplicationID, out application))
                    return application as TApplication;
                current.Save();
                return current;
            }
        }

        /// <summary>
        /// 获取当前应用程序配置实例对象。
        /// </summary>
        public TConfiguration Configuration
        {
            get
            {
                return ConfigurationBase<TConfiguration>.GetConfiguration(this.ApplicationID);
            }
        }

        /// <summary>
        /// 保存当前应用程序。
        /// </summary>
        /// <returns>返回执行结果。</returns>
        public override bool Save()
        {
            return Applications.SaveApplication<TApplication, TConfiguration>((TApplication)this);
        }

        /// <summary>
        /// 当前应用程序版本。
        /// </summary>
        public override int VersionBuild
        {
            get
            {
                if (base.VersionBuild == 0)
                    base.VersionBuild = Globals.GetVersion(typeof(TApplication)).Build;
                return base.VersionBuild;
            }
            set { base.VersionBuild = value; }
        }

        /// <summary>
        /// 字符串版本。
        /// </summary>
        public override string VersionString
        {
            get
            {
                Version version = typeof(TApplication).Assembly.GetName().Version;
                return string.Format("v{0}.{1}", version.Major, version.Minor);
            }
        }

        /// <summary>
        /// 应用程序名称。
        /// </summary>
        public override string ApplicationName
        {
            get { return typeof(TApplication).Name; }
        }
    }
}
